Mocking একটি গুরুত্বপূর্ণ কৌশল যা ইউনিট টেস্টিং (Unit Testing) প্রক্রিয়ায় ব্যবহৃত হয়, যাতে নির্দিষ্ট কম্পোনেন্ট বা ক্লাসের উপর নির্ভরশীল অংশগুলোকে পরিবর্তন করে তাদের প্রতিস্থাপন করা যায়। এটি মূলত টেস্টিংয়ের সময় নির্দিষ্ট ডিপেনডেন্সি বা ইনপুট সরবরাহ করতে সাহায্য করে, যাতে প্রকৃত কার্যকারিতা বা বাহ্যিক সিস্টেমের উপর নির্ভর না করে শুধুমাত্র প্রোগ্রামের লজিক পরীক্ষা করা যায়।
Moq একটি জনপ্রিয় এবং শক্তিশালী mocking ফ্রেমওয়ার্ক, যা .NET প্ল্যাটফর্মে ব্যবহৃত হয়। এটি সহজেই টেস্টিংয়ের জন্য মক অবজেক্ট তৈরি করতে সাহায্য করে, যা ব্যবহারকারীর নির্দিষ্ট ডিপেনডেন্সি বা ক্লাসের আচরণ সিমুলেট করতে পারে।
Moq ফ্রেমওয়ার্ক দিয়ে একটি মক অবজেক্ট তৈরি করার জন্য প্রথমে Moq NuGet প্যাকেজ ইনস্টল করতে হবে:
dotnet add package Moq
তারপর, নিচের ধাপগুলো অনুসরণ করতে পারেন:
ধরা যাক, আমাদের একটি IUserService
ইন্টারফেস রয়েছে, যেটি ব্যবহারকারী সম্পর্কিত ডেটা প্রদান করে। আমরা একটি মক অবজেক্ট তৈরি করতে চাই যেটি এই ইন্টারফেসটি সিমুলেট করবে:
public interface IUserService
{
string GetUserName(int userId);
bool IsUserActive(int userId);
}
এখন, Moq ব্যবহার করে এই IUserService
ইন্টারফেসটির একটি মক তৈরি করি:
using Moq;
public void Test_UserService()
{
var mockUserService = new Mock<IUserService>();
// Setup mock behavior
mockUserService.Setup(service => service.GetUserName(It.IsAny<int>())).Returns("John Doe");
mockUserService.Setup(service => service.IsUserActive(It.IsAny<int>())).Returns(true);
// Use the mock in test
var userName = mockUserService.Object.GetUserName(1);
var isActive = mockUserService.Object.IsUserActive(1);
Console.WriteLine(userName); // Output: John Doe
Console.WriteLine(isActive); // Output: True
}
এখানে mockUserService.Setup()
দিয়ে আমরা GetUserName()
এবং IsUserActive()
মেথডের জন্য মক আচরণ সেট করেছি, যাতে প্রত্যাশিত আউটপুট প্রদান করে।
আপনি যদি নিশ্চিত হতে চান যে মক অবজেক্টের কোনো মেথড নির্দিষ্ট সংখ্যক বার কল হয়েছে, তবে Verify()
মেথড ব্যবহার করতে পারেন:
mockUserService.Verify(service => service.GetUserName(It.IsAny<int>()), Times.Once());
এটি যাচাই করে যে GetUserName()
মেথডটি ঠিক একবার কল হয়েছে কি না।
Moq ব্যবহার করে আপনি আর্গুমেন্টের উপর ভিত্তি করে মক আচরণ কনফিগার করতে পারেন এবং আউটপুট যাচাই করতে পারেন:
mockUserService.Setup(service => service.GetUserName(It.Is<int>(id => id == 1))).Returns("John Doe");
var result = mockUserService.Object.GetUserName(1);
Console.WriteLine(result); // Output: John Doe
এখানে It.Is<int>(id => id == 1)
দিয়ে আমরা নির্দিষ্ট আর্গুমেন্ট 1
এর জন্য আচরণ নির্ধারণ করেছি।
Moq ফ্রেমওয়ার্কে কিছু উন্নত ফিচারও রয়েছে, যা আপনাকে আরও বেশি কাস্টমাইজেশন এবং টেস্টিং এর ক্ষমতা প্রদান করে:
Callback:
mockUserService.Setup(service => service.IsUserActive(It.IsAny<int>())).Callback<int>((id) => Console.WriteLine($"Checking active status for user {id}"));
Throws:
Throws()
মেথড ব্যবহার করা যেতে পারে। এটি টেস্টে ইরর কন্ডিশন চেক করার জন্য উপকারী।mockUserService.Setup(service => service.GetUserName(It.IsAny<int>())).Throws(new Exception("User not found"));
ReturnsAsync:
Task
বা Task<T>
রিটার্ন করে, তবে আপনি ReturnsAsync()
ব্যবহার করতে পারেন:mockUserService.Setup(service => service.GetUserNameAsync(It.IsAny<int>())).ReturnsAsync("John Doe");
Moq ফ্রেমওয়ার্কটি সাধারণত একক ইউনিট টেস্টের জন্য ব্যবহৃত হয়। নিচে একটি ইউনিট টেস্টের উদাহরণ দেখানো হলো যেখানে IUserService
ইন্টারফেসের মক ব্যবহার করা হয়েছে:
using Moq;
using Xunit;
public class UserServiceTests
{
[Fact]
public void Test_GetUserName_Returns_Correct_Username()
{
var mockUserService = new Mock<IUserService>();
mockUserService.Setup(service => service.GetUserName(1)).Returns("John Doe");
var result = mockUserService.Object.GetUserName(1);
Assert.Equal("John Doe", result);
}
[Fact]
public void Test_IsUserActive_Returns_True()
{
var mockUserService = new Mock<IUserService>();
mockUserService.Setup(service => service.IsUserActive(1)).Returns(true);
var result = mockUserService.Object.IsUserActive(1);
Assert.True(result);
}
}
এই টেস্টে, আমরা IUserService
ইন্টারফেসের জন্য মক অবজেক্ট তৈরি করেছি এবং এর মেথডগুলোর আচরণ কনফিগার করেছি। তারপর Assert
ব্যবহার করে পরীক্ষাটি সম্পন্ন করেছি।
Moq ফ্রেমওয়ার্কটি .NET প্ল্যাটফর্মে ইউনিট টেস্টিংয়ের জন্য একটি শক্তিশালী এবং জনপ্রিয় টুল। এটি ডিপেনডেন্সি ইনজেকশন ও ডিপেনডেন্ট অবজেক্টের আচরণ কাস্টমাইজ করে, যাতে শুধুমাত্র পরীক্ষিত কোডের লজিক নিশ্চিত করা যায়। Moq ব্যবহার করে আপনি সহজেই মক অবজেক্ট তৈরি, আচরণ কনফিগার এবং মেথড কল যাচাই করতে পারবেন, যা টেস্টিং প্রক্রিয়াকে আরও সহজ এবং কার্যকর করে তোলে।
common.read_more